/**
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package trim.pl;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import trim.Trim;
import trim.pl.classloader.TrimClassLoader;

/**
 * Класс предназначенный для управления плагинами:загрузкой, выгрузкой и пр.
 *
 * @author Дмитрий
 */
public class PlaginLoader
{

  private List<TrimPlagin> plagins=new ArrayList();
  private Trim[] methods=new Trim[0];

  /**
   * Создание менеджера плагинов
   * @return
   */
  public PlaginLoader()
  {
  }

  /**
   * Получение загрузчика отдельного плагина
   * @param index
   * @return
   */
  public TrimPlagin getPlagin(int index)
  {
    return plagins.get(index);
  }

  /**
   * Количество загруженных плагинов
   * @return Количество загруженных плагинов
   */
  public int getPlaginCount()
  {
    return plagins.size();
  }

  public List<TrimPlagin> getPlagins()
  {
    return plagins;
  }

  /**
   * Загрузка нового плагина
   * @param fileName имя загружаемого файла
   */
  public TrimPlagin loadPlagin(String fileName)
  {
    return loadPlagin(new File(fileName));
  }

  /**
   * Загрузка нового плагина
   * @param jarFile библиотека алгиритмов
   */
  public TrimPlagin loadPlagin(File jarFile)
  {
    TrimPlagin trimPlagin=new TrimPlagin(new TrimClassLoader(jarFile));
    plagins.add(trimPlagin);
    return trimPlagin;
  }

  /**
   * Количество загруженных алгоритмов (методов решения)
   * @return
   */
  public int getMethodCount()
  {
    int res=0;
    for(TrimPlagin cl:plagins)
      res+=cl.getMethodCount();
    return res;
  }

  /**
   * Выгрузка плагина
   * @param i номер выгружаемого файла-плагина
   */
  public void removePlagin(int i)
  {
    plagins.remove(i);
  }

  /**
   * Выгрузка плагина
   * @param plaginName имя выгружаемого файла-плагина
   */
  public void removePlagin(String plaginName)
  {
    TrimPlagin cl=null;
    for(TrimPlagin p:plagins)
      if(p.getPlaginName().equals(plaginName))
        cl=p;
    if(cl!=null)
      plagins.remove(cl);
  }

  /**
   * Получение метода решения по имени класса
   * @param className
   * @return
   * @throws java.lang.ClassNotFoundException
   */
  public Trim getMethod(String className) throws ClassNotFoundException
  {
    for(TrimPlagin p:plagins)
    {
      Trim t=p.getTrimMethod(className);
      if(t!=null)
        return t;
    }
    throw new ClassNotFoundException("Класс "+className+" не найден или не является методом решения ЗФР.");
  }

  /**
   * Получение списка методов отдельно плагина
   * @param plaginName имя плагина
   * @return
   */
  public List<Trim> getPlaginMethods(String plaginName)
  {
    TrimPlagin cl=null;
    for(TrimPlagin p:plagins)
      if(p.getPlaginName().equals(plaginName))
        cl=p;
    if(cl!=null)
      return cl.getMethods();
    return new ArrayList(0);
  }

  /**
   * Получение списка методов отдельно плагина
   * @param plaginNo номер плагина
   * @return
   */
  public List<Trim> getPlaginMethods(int plaginNo)
  {
    TrimPlagin cl=plagins.get(plaginNo);
    if(cl!=null)
      return cl.getMethods();
    return new ArrayList(0);
  }
}
